查看原文
其他

你的 legend 还是画的很丑?

JunJunLab 老俊俊的生信笔记 2022-08-15

点击上方关注我们



快乐的处暑



plot 函数是不能自动生成图例的,不像 ggplot 那样映射后会自动生成图例,因此我们需要 手动创建注释图例 ,在群里会经常遇到小伙伴们问图例的调整问题 ,这次让大家全面了解下怎样方便的绘制出自己想要的图例形式。

我们使用 legend 函数来给我们的图添加图例。

legend 函数用法及参数说明:

Usage
legend(x, y = NULL# 图例位置坐标,也可以是字符串:"bottomright", "bottom", "bottomleft", "left", "topleft", "top", "topright", "right" and "center"
       legend, # 字符串或表达式
       fill = NULL# 图例填充颜色
       col = par("col"), # 点、线等图形的颜色
       border = "black"# 图例边框颜色
       lty, # 线形
       lwd, # 线粗
       pch, # 点的形状
       angle = 45# 填充线的角度
       density = NULL# 图例填充线
       bty = "o"# 图例边框类型,n表示没有边框
       bg = par("bg"), # 图例背景色
       box.lwd = par("lwd"), # 图例边框线粗
       box.lty = par("lty"), # 图例边框线形
       box.col = par("fg"), # 图例边框线颜色
       pt.bg = NA# 点的填充颜色
       cex = 1# 点或标签大小
       pt.cex = cex, # 点大小
       pt.lwd = lwd, # 点边框粗细
       xjust = 0# 相对于x位置的对齐方式,0左对齐,0.5居中,1右对齐
       yjust = 1# 相对于y位置的对齐方式,0左对齐,0.5居中,1右对齐
       x.intersp = 1# 图例中文字离图片的水平距离
       y.intersp = 1# 图例中文字离图片的竖直距离
       adj = c(00.5), # 图例文字的位置对齐,1或2个向量
       text.width = NULL# 图例文字的宽度
       text.col = par("col"), # 图例文字的颜色
       text.font = NULL# 图例文字的字体
       merge = do.lines && has.pch, # 是否把点和线合并绘制
       trace = FALSE# 是否显示图例计算信息
       plot = TRUE# 是否显示图例
       ncol = 1# 图例单元的列数
       horiz = FALSE# 图例是否水平放置
       title = NULL# 图例上方的标题
       inset = 0# 当图例位置是字符串时,可以使用这个参数进行微调
       xpd, # TRUE时可以在绘图区外绘制图例,FALSE则只能在绘图里添加图例
       title.col = text.col, # 图例标题的颜色
       title.adj = 0.5# 图例标题的对齐方式
       seg.len = 2 # 图例线的长度
       )

接下来我们实战考察一下参数使用。

1、图例位置

字符串指定:

# 生成数据
x <- runif(100,min = 1,max = 100)
y <- runif(100,min = 1,max = 100)

par(mfrow = c(1,1))
# 绘图
plot(x,y,
     type = 'p',pch = 23,bg = 'pink',col = 'red',
     cex = 2.5,lwd = 2)
# 添加图例

pos <- c("bottomright""bottom""bottomleft""left",
         "topleft""top""topright""right" , "center")
# 绘制图例
lapply(pos, function(x){legend(x,legend = paste('I am ',x,sep = ''),
                               pch = 23# 形状
                               pt.cex = 2# 图例符号大小
                               # 填充色和边框颜色
                               pt.bg = 'pink',col = 'red')})

使用inset 参数微调:

# 微调图例

par(mfrow = c(1,1))
# 绘图
plot(x,y,
     type = 'p',pch = 23,bg = 'pink',col = 'red',
     cex = 2.5,lwd = 2)
# 没有调整
legend('topright',legend = paste('I am ','topright',sep = ''),
       pch = 23# 形状
       pt.cex = 2# 图例符号大小
       # 填充色和边框颜色
       pt.bg = 'pink',col = 'red')
# 微调
legend('topright',legend = paste('I am ajusted ','topright',sep = ''),
       pch = 23# 形状
       pt.cex = 2# 图例符号大小
       # 填充色和边框颜色
       pt.bg = 'pink',col = 'red',
       inset = 0.1)

指定坐标位置:

# 指定摆放位置
legend(x = 15,y = 85,
       legend = paste('I am xy ',sep = ''),
       pch = 23# 形状
       pt.cex = 2# 图例符号大小
       # 填充色和边框颜色
       pt.bg = 'pink',col = 'red',
       inset = 0.1)

2、添加填充线

density 可以控制填充线密度:

# 添加填充线
par(mfrow = c(1,1))
# 绘图
plot(x,y)
legend('top',legend = 'I am Legend',cex = 2,
       density = 20,angle = 30)
legend('center',legend = 'I am Legend',cex = 3,
       density = 10,angle = 30)

3、有无边框

# 有无边框
par(mfrow = c(1,1))
# 绘图
plot(x,y,type = 'n')
legend('top',legend = 'I am Legend',cex = 2,bty = 'o')
legend('center',legend = 'I am Legend',cex = 2,bty = 'n')

4、点线合并

# 点线合并
par(mfrow = c(1,1))
# 绘图
plot(1:3,c(1,3,1),type = 'o')
# 合并
legend('topright',legend = 'I am Legend',
       title = 'I am title'# 标题
       title.col = 'blue',
       title.adj = 0# 标题左对齐
       pch = 1,lty = 1# 点、线
       # 合并
       merge = T)
# 不合并
legend('right',legend = c('dot','line'),
       title = 'I am title'# 标题
       title.col = 'red',
       title.adj = 0.5# 标题居中
       pch = 1,lty = 1# 点、线
       # 不合并
       merge = F)

5、图例列数

使用ncol 参数控制图例列数:

# 图例列数
par(mfrow = c(1,1))
# 绘图
plot(1:3,c(1,3,1),type = 'o')
# 一列
legend('left',legend = LETTERS[1:5],
       pch = 1:5,col = rainbow(5))
# 合并
legend('center',legend = LETTERS[1:5],
       pch = 1:5,col = rainbow(5),ncol = 3)

6、图例文字调整

# 图例文字调整
par(mfrow = c(1,1))
# 绘图
plot(1:3,c(1,3,1),type = 'n')
# 添加图例
legend('bottomleft',legend = c('one','two','three','four','five'),
       pch = 1:5,col = rainbow(5))
legend('bottom',legend = c('one','two','three','four','five'),
       pch = 1:5,col = rainbow(5),
       # 增大文字与字符距离
       x.intersp = 2)
legend('right',legend = c('one','two','three','four','five'),
       pch = 1:5,col = rainbow(5),
       # 增加竖直间距
       y.intersp = 2)

7、图例放到图外

当我们想把图例放到绘图外时,先得把绘图边界加宽,才好放置图例,使用 mar 参数:

# 图例绘制位置
par(mfrow = c(1,1),mar = c(2,2,2,8))
# 绘图
plot(1:3,c(1,3,1),type = 'n')
# 水平放置
legend('center',
       legend = c('one','two','three','four','five','six','seven','eight'),
       pch = 1:8,col = rainbow(5),cex = 0.5,
       # 水平放置
       horiz = T)
# 放到绘图区外
legend(x = 3.3,y = 2.5,
       legend = c('one','two','three','four','five','six','seven','eight'),
       cex = 1,
       pch = 1:8,col = rainbow(5),
       xpd = T)

剩下的参数大家自行区探索吧。


收官!


代码 我上传到 QQ 群 老俊俊生信交流群 文件夹里。欢迎加入。加我微信我也拉你进 微信群聊 老俊俊生信交流群 哦。

群二维码:


老俊俊微信:




知识星球:



所以今天你学习了吗?

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!

推 荐 阅 读




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存